﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include <deque>
#include <algorithm>

/*
* deque构造函数
* deque<T> deqT;//默认构造形式
* deque(iterator_begin, iterator_end);//构造函数将[iterator_begin, iterator_end)间的元素拷贝给本身
* deque(n, elem);//构造函数将n个elem拷贝给本身
* deque(const deque &deq);//拷贝构造函数
*
* deque赋值操作
* assign(iterator_begin, iterator_end);//将[iterator_begin, iterator_end)区间内的元素赋值给本身
* assign(n, elem);//将n个elem拷贝赋值给本身
* deque& operator=(const deque &deq);//重载等号操作符
* swap(deq);//将deq与本身的元素互换；
*
* deque大小操作
* deque.size();//返回容器中元素的个数
* deque.empty();//判断容器是否为空
* deque.resize(int num);//重新指定容器的长度为num，若容器变长，则以默认值填充新位置。如果容器变短，则末尾超出容器长度的元素被删除；
* deque.resize(int num, elem);//重新指定容器的长度为num，若容器变长，则以elem填充新位置。如果容器变短，则末尾超出容器长度的元素被删除；
*/
/*
* deque双端插入和删除操作
* push_back(elem);//在容器尾部添加一个数据
* push_front(elem);//在容器头部插入一个数据
* pop_back();//删除容器最后一个数据
* pop_front();//删除容器第一个数据
*
* deque数据存取
* at(int idx);//返回索引idx所指的数据；如果idx越界，抛出out_of_range
* operator[];//返回索引idx所指的数据；如果idx越界，不抛出异常，直接报错
* front();//返回第一个数据
* back();//返回最后一个数据
*
* deque插入操作
* insert(pos, elem);//在pos位置插入一个elem元素的拷贝，返回新数据的位置；
* insert(pos, n, elem);//在pos位置插入n个elem数据，无返回值；
* insert(pos, begin, end);//在pos位置插入[begin, end)区间的数据，无返回值；
*
* deque删除操作
* clear();//移除容器的所有数据
* erase(begin, end);//删除[begin, end)区间的数据，返回下一个数据的位置
* erase(pos);//删除pos位置的数据，返回下一个数据的位置
*
*/
void printDeque(const deque<int>& d)
{
	//1.iterator，普通迭代器；reverse_iterator，逆序迭代器；const_iterator，只读迭代器；
	for (deque<int>::const_iterator it = d.begin(); it != d.end(); ++it)
	{
		//*it = 10000;
		cout << *it << " ";
	}
	cout << endl;
}
//8.排序规则；降序排列，100>10;
bool myCompareSort(int v1, int v2)
{
	return v1 > v2;
}
void testDeque()
{
	deque<int> d;
	d.push_back(10);
	d.push_back(40);
	d.push_back(30);
	d.push_back(20);

	printDeque(d);//10 40 30 20

	deque<int> ds(d.begin(), d.end());
	ds.push_back(1000);

	//2.交换；
	d.swap(ds);
	printDeque(d);//10 40 30 20 1000

	if (ds.empty())
	{
		cout << "ds为空！" << endl;
	}
	else
	{
		cout << "ds不为空，大小为：" << ds.size() << endl;//4
	}

	deque<int> dp;
	dp.push_back(10);
	dp.push_back(30);
	dp.push_back(20);
	dp.push_front(100);
	dp.push_front(200);

	printDeque(dp);//200 100 10 30 20

	//3.删除，头删，尾删；
	dp.pop_front();
	dp.pop_back();
	printDeque(dp);//100 10 30

	cout << "头元素front为：" << dp.front() << endl;//100
	cout << "尾元素front为：" << dp.back() << endl;//30

	//4.插入；
	deque<int> di;
	di.push_back(50);
	di.push_back(60);
	di.insert(di.begin(), dp.begin(), dp.end());
	printDeque(di);//100 10 30 50 60

	//5.排序；
	deque<int> dSort;
	dSort.push_back(5);
	dSort.push_back(15);
	dSort.push_back(3);
	dSort.push_back(40);
	dSort.push_back(7);

	printDeque(dSort);//5 15 3 40 7

	//6.从小到大顺序；
	sort(dSort.begin(), dSort.end());
	printDeque(dSort);//3 5 7 15 40

	//7.从大到小顺序；
	sort(dSort.begin(), dSort.end(), myCompareSort);
	printDeque(dSort);//40 15 7 5 3
}

//main321：deque双端队列容器
int main321()
{
	testDeque();

	system("pause");
	return EXIT_SUCCESS;
}